package offer.day6;

import java.util.Stack;

public class No9twoStacksQueue {
    /*
     * 面试题9：用两个栈实现队列
     *    题目：用两个栈实现一个队列。队列的声明如下，
     *    	  template <typename T> class CQueue{
     *    	  	  public :
     *    				CQueue(void);
     *    				~CQueue(void);
     *
     *    			 	void append(const T& node);
     *    				T deleteHead();
     *    		  private:
     *    				stack<T> stack1;
     *   				stack<T> stack2;
     *    	  }
     *    	      请实现它的两个函数appendTail和deleteHead，
     *    	      分别完成在队列尾部插入节点和在队列的首部删除节点的操作
     *
     *  	思路：一个栈压入元素，而另一个栈作为缓冲，将栈1的元素出栈后压入栈2中。
     *          也可以将栈1中的最后一个元素直接出栈，而不用压入栈2中再出栈。
     * */
    Stack<Integer> stack1 = new Stack<>();
    Stack<Integer> stack2 = new Stack<>();

    public static void main(String[] args) {
        No9twoStacksQueue admin=new No9twoStacksQueue();
        admin.add(1);
        admin.add(2);
        admin.add(3);
        admin.add(4);
        System.out.println(("查看队列大小:"+admin.size()));
        System.out.println("查看队列最开始的元素:"+admin.peek());
        System.out.println("删去第一个元素:"+admin.poll());
        System.out.println("查看队列最开始的元素:"+admin.peek());

    }

    public void add(int i) {
        stack1.push(i);
    }

    public int poll() {
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
        int val=stack2.pop();
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        return val;
    }

    public int size(){
        return stack1.size();

    }

    public boolean isEmpty(){
        return stack1.isEmpty();
    }

    public int peek(){
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
        int val=stack2.peek();
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        return val;
    }
}
